package com.coolingme.lazy02;

/**
 * 懒汉式单例模式
 * <p>
 * 阻塞并不是基于整个 LazySimpleSingleton 类的阻塞，而是在 getInstance() 方法内部阻塞，
 * 只要逻辑不是太复杂，对于调用者而言感知不到
 * <p>
 * 但是，用到 synchronized 关键字，总归是要上锁，对程序性能还是存在一定影响的
 *
 * @author wangyue
 * @date 2020/9/29 9:39
 */
public class LazyDoubleCheckSingleton {

    private static LazyDoubleCheckSingleton lazySingleton;

    private LazyDoubleCheckSingleton() {
    }

    public static LazyDoubleCheckSingleton getInstance() {
        // 双重检查锁
        if (lazySingleton == null) {
            synchronized (LazyDoubleCheckSingleton.class) {
                if (lazySingleton == null) {
                    // 1、分配内存给这个对象
                    // 2、初始化对象
                    // 3、设置lazySingleton指向刚分配的内存地址
                    lazySingleton = new LazyDoubleCheckSingleton();
                }
            }
        }
        return lazySingleton;
    }

}
